package com.yhl.springtest.service;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service;


import java.io.*;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author: yanghl
 * @description: TODO
 * @date: 2023/8/15 14:39
 */
@Service
public class CommomService {

    public InetAddress getMyIp(){
        InetAddress localHost = null;
        try {
            localHost = InetAddress.getLocalHost();
            System.out.println("getInfo: " + localHost.toString());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        return localHost;
    }

    public String getMemory(){
        long l = Runtime.getRuntime().maxMemory();
        return String.valueOf(l);
    }

    public String getSome(){
        return "yhl";
    }

    public Map readExcel() throws Exception {
        File file = new File("F:/文档/深圳分支/需求/XQGD-2024031800190BSP系统IPT产品价格管理优化需求/IPT_IMPORT_MODEL.xlsx");
        InputStream is = new FileInputStream(file);
        Workbook workbook = new XSSFWorkbook(is);
        HashMap<String, Object> restMap = new HashMap<>();
        List iptList = iptExcel(workbook);
        restMap.put("DATA", iptList);
        return restMap;
    }


    private List iptExcel(Workbook workbook) throws Exception {
        List<Map> resultList = new ArrayList<Map>();
        //第一个sheet页
        Sheet sheet1 = workbook.getSheetAt(0);
        //获取文档中已保存数据的行数
        int rowNum1 = sheet1.getPhysicalNumberOfRows();
        Row row;
        //获取第2行  第一行为标题
        for (int i = 1; i < rowNum1; i++) {
            row = sheet1.getRow(i);
            if (i == 1 && null == row) {
                throw new Exception("请按照表格模板，从第二行录入数据！");
            }
            if (!isEmptyRow(row)) {
                Map<String, Object> item = new HashMap<String, Object>();
                item.put("ROW", "第" + (i + 1) + "行");
                item.put("BUSITYPE_CODE", "1130");
                //区域 row.getCell(0)
                item.put("PROVINCE", getValueFromCell(row.getCell(0)));
                item.put("ACCESS_SITE_CODE", getValueFromCell(row.getCell(1)));
                item.put("MIN_BANDWIDTH", getValueFromCell(row.getCell(2)));
                resultList.add(item);
            }
        }
        return resultList;
    }

    //判断是不是空行
    private static boolean isEmptyRow(Row row){
        Iterator<Cell> iterator = row.iterator();
        boolean flag = true;
        while (iterator.hasNext()){
            if (!"".equals(iterator.next().toString())){
                flag = false;
                break;
            }
        }
        return flag;
    }

    //获取单元格的值
    private static String getValueFromCell(Cell cell) {
        String value = null;
        if (null == cell) {
            return null;
        }
        /**
            _NONE(-1), 表示单元格类型未设置或未知。通常在特定情况下不会直接使用。
            NUMERIC(0), 表示单元格包含数值（包括日期和时间）。这是最常见的单元格类型之一，用于存储各种数值数据。
            STRING(1), 表示单元格包含文本字符串。通常用于存储文本数据。
            FORMULA(2), 表示单元格包含公式。公式单元格可以计算并返回数值、字符串或布尔值。
            BLANK(3), 表示单元格为空。注意，空单元格与包含空字符串的单元格不同。
            BOOLEAN(4), 表示单元格包含布尔值（true 或 false）。
            ERROR(5); 表示单元格包含错误。错误单元格通常用于表示计算错误或无效的数据引用。
         **/
        // 判断cell类型
        switch (cell.getCellType()) {
            //数字
            case NUMERIC: {
                if (DateUtil.isCellDateFormatted(cell)) {//处理日期格式、时间格式
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    Date date = cell.getDateCellValue();
                    value = sdf.format(date);
                } else {
                    value = String.valueOf(cell.getNumericCellValue()).trim();
                }
                break;
            }
            // 字符
            case STRING: {
                value = cell.getRichStringCellValue().getString().trim();
                break;
            }
        }
        return value;
    }
}

